const stringRandom = require('string-random');

module.exports = class extends think.Service {
  /**
   * 计算加密的密码
   */
  getEncryptPassword(password, encrypt) {
    return think.md5(think.md5(password) + encrypt);
  }

  /**
   *
   * @param {Integer} length  生成的字符串的长度
   * @param {Object} options  参数选项
   *
   * options 对象：
   *
   * options.letters
   *  true (默认) 允许大小写字母
   *  false 不允许大小写字母
   *  string 从提供的字符生成随机结果
   * options.numbers
   *  true (默认) 允许数字
   *  false 不允许数字
   *  string 从提供的字符生成随机结果
   * options.specials
   *  true 允许特殊字符
   *  false (默认) 不允许特殊字符
   *  string 从提供的字符生成随机结果
   */
  getRamdomString(length = 6, options = {}) {
    return stringRandom(length, options);
  }

  /**
   * 默认使用秒为单位，记录自1970-1-1以来的秒数
   * @param useSecond 单位是秒还是毫秒
   * @returns {number}
   */
  getTime(useSecond = true) {
    if (useSecond) {
      return Math.round(new Date().getTime() / 1000);
    } else {
      return new Date().getTime();
    }
  }

  /**
   * 将自1970-1-1以来的秒数转换为日期格式
   * @param time
   * @param fmt 转换后的格式，支持 "YYYY-MM-DD HH:mm:ss"
   * @param useSecond 单位是秒还是毫秒
   * @returns {*}
   */
  datetime(time, fmt = 'YYYY-MM-DD', useSecond = true) {
    if (useSecond) {
      return think.datetime(time * 1000, fmt);
    } else {
      return think.datetime(time, fmt);
    }
  }

  async getImageFullPath(id) {
    return think.model('image').getFullPath(id);
  }

  // 将使用分隔符间隔的字符串属性转换成数组形式，支持批量转换对象的属性
  // USAGE:
  // think.service('utils').slitAttributes(data, ['tags', 'courses', 'certification']);
  // 或者
  // await think.service('utils').slitAttributes(data,'tags,courses,certification',',');
  splitAttributes(item, attributes, delimiter = ',') {
    if (!think.isArray(attributes) && think.isString(attributes)) {
      attributes = attributes.split(delimiter);
    }

    for (const att of attributes) {
      if (item.hasOwnProperty(att) && !think.isEmpty(item[att])) {
        item[att] = item[att].split(delimiter);
      }
    }
    return item;
  }
};
